package thread;

public class test13 {
     /*有三个线程，线程名称分别为：a，b，c。
        每个线程打印自己的名称。
        需要让他们同时启动，并按 c，b，a的顺序打印*/

    /*简述 wait 和 sleep 有什么区别？
    共同点：
    都是使线程暂停一段时间的方法。
    不同点：
    wait是Object类中的一个方法，sleep是Thread类中的一个方法；
    wait必须在synchronized修饰的代码块或方法中使用，sleep方法可以在任何位置使用；
    wait被调用后当前线程进入BLOCK状态并释放锁，并可以通过notify和notifyAll方法进行唤醒；sleep被调用后当前线程进入TIMED_WAIT状态，不涉及锁相关的操作;*/

    public static void main(String[] args) {
        Object locked1=new Object();
        Object locked2=new Object();
        Object locked3=new Object();
        Thread a=new Thread(()->{
            synchronized (locked1){
                try {
                    locked1.wait(300);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("a");
            }
        });
        Thread b=new Thread(()->{
            synchronized (locked2){
                try {
                    locked2.wait(200);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("b");
            }
        });
        Thread c=new Thread(()->{
            synchronized (locked3){
                try {
                    locked3.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("c");
            }
        });
        Thread d=new Thread(()->{
            synchronized (locked3){
                locked3.notify();
            }
        });
        a.start();
        b.start();
        c.start();
        d.start();
    }
}
